﻿/**
 * FATFS测试文件
 *
 * 本工程为《FATFS完全学习指南》系列课程中的第一部分入门课程，介绍
 * FATFS基本的接口的使用。配套免费的视频课程用于学习。
 *
 * 作者：李述铜
 * 视频课程：https://lishutong1024.github.io
 * 配套资料：https://www.yuque.com/lishutong-docs/fatfs_api/cp15hpoflevfqxk7
 */
#include <stdio.h>
#include "../fatfs/source/ff.h"
#include "../fatfs/source/diskio.h"

// FATFS结构，以静态结构的方式定义，或者用malloc分配
static FATFS disk1_fs;			// 针对disk1.vhd
static FATFS disk2_fs;			// 针对disk2.vhd

int main(void) {
	// 挂载文件系统
	FRESULT res = f_mount(&disk1_fs, "0:", 1);
	if (res != FR_OK) {
		printf("mount disk1 failed.\n");
		return -1;
	}

	// 挂载文件系统
	res = f_mount(&disk2_fs,  "1:", 1);
	if (res != FR_OK) {
		printf("mount disk2 failed.\n");
		return -1;
	}

	// 打开文件
	FIL file;
	res = f_open(&file, "0:/data_write.bin", FA_WRITE | FA_CREATE_ALWAYS);
	if (res != FR_OK) {
		printf("open file error.\n");
		return -1;
	}

	// 将文件扩充至连续的100KB
#define FILE_SIZE		(100 * 1024)
	res = f_expand(&file, FILE_SIZE, 1);
	if (res != FR_OK) {
		printf("expand failed.\n");
		return -1;
	}

	static char buf[FILE_SIZE];
	for (int i = 0; i < FILE_SIZE; i++) {
		buf[i] = i;
	}

	// 如何体现出这种效果
	BYTE drv = file.obj.fs->pdrv;			// 取驱动器号
	LBA_t lba = file.obj.fs->database + file.obj.fs->csize * (file.obj.sclust - 2);  // 文件数据的起始扇区号

	// 底层写入
	DRESULT dres = disk_write(drv, buf, lba, FILE_SIZE / 512);

	// 普通方式写入
	UINT write_size;
	res = f_write(&file, buf, sizeof(buf), &write_size);
		
	// 在文件关闭时，有文件写入刷新的调用
	f_close(&file);

	// 卸载文件系统
	f_unmount( "0:");
	f_unmount( "1:");
	return 0;
}